package com.yupi.yuaicodemother.langGraph4j.tools;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.yupi.yuaicodemother.langGraph4j.model.ImageResource;
import com.yupi.yuaicodemother.langGraph4j.model.enums.ImageCategoryEnum;
import com.yupi.yuaicodemother.manager.CosManager;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class LogoGeneratorTool {

    @Value("${dashscope.api-key:}")
    private String dashScopeApiKey;

    @Value("${dashscope.image-model:wan2.2-t2i-flash}")
    private String imageModel;

    // 注入 COS 管理器（与 MermaidDiagramTool 共用）
    @Resource
    private CosManager cosManager;

    @Tool("根据描述生成 Logo 设计图片，用于网站品牌标识")
    public List<ImageResource> generateLogos(@P("Logo 设计描述，如名称、行业、风格等，尽量详细") String description) {
        List<ImageResource> logoList = new ArrayList<>();
        if (StrUtil.isBlank(description)) {
            log.warn("Logo 生成失败：设计描述为空");
            return logoList;
        }

        try {
            // 1. 调用阿里云 AI 生成 Logo，获取临时图片 URL
            String aiImageUrl = generateLogoByAI(description);
            if (StrUtil.isBlank(aiImageUrl)) {
                log.warn("Logo 生成失败：AI 未返回有效图片 URL");
                return logoList;
            }

            // 2. 下载 AI 生成的图片到本地临时文件
            File tempLogoFile = downloadImageToTempFile(aiImageUrl);
            if (tempLogoFile == null || !tempLogoFile.exists() || tempLogoFile.length() == 0) {
                log.error("Logo 下载失败：临时文件无效");
                return logoList;
            }

            // 3. 上传临时文件到 COS
            String cosUrl = uploadToCos(tempLogoFile, description);
            if (StrUtil.isBlank(cosUrl)) {
                log.error("Logo 上传 COS 失败");
                return logoList;
            }

            // 4. 封装结果并返回
            logoList.add(ImageResource.builder()
                    .category(ImageCategoryEnum.LOGO)
                    .description(description)
                    .url(cosUrl)
                    .build());

        } catch (Exception e) {
            log.error("生成 Logo 失败: {}", e.getMessage(), e);
        }
        return logoList;
    }

    /**
     * 调用阿里云 AI 生成 Logo，返回图片临时 URL
     */
    private String generateLogoByAI(String description) throws NoApiKeyException {
        String logoPrompt = String.format("生成 Logo，Logo 中禁止包含任何文字！Logo 介绍：%s", description);
        ImageSynthesisParam param = ImageSynthesisParam.builder()
                .apiKey(dashScopeApiKey)
                .model(imageModel)
                .prompt(logoPrompt)
                .size("512*512")
                .n(1) // 生成 1 张图片
                .build();

        ImageSynthesis imageSynthesis = new ImageSynthesis();
        ImageSynthesisResult result = imageSynthesis.call(param);

        // 提取 AI 返回的图片 URL
        if (result != null && result.getOutput() != null && result.getOutput().getResults() != null) {
            List<Map<String, String>> results = result.getOutput().getResults();
            for (Map<String, String> imageResult : results) {
                return imageResult.get("url"); // 返回第一张图片的 URL
            }
        }
        return null;
    }

    /**
     * 下载图片到本地临时文件（参考 MermaidDiagramTool 的临时文件处理逻辑）
     */
    private File downloadImageToTempFile(String imageUrl) {
        // 创建临时文件（后缀为 .png，适配 Logo 常见格式）
        File tempFile = FileUtil.createTempFile("logo_ai_", ".png", true);
        try {
            // 下载图片并写入临时文件
            HttpRequest.get(imageUrl)
                    .timeout(15000) // 延长超时时间，确保大图片下载完成
                    .execute()
                    .writeBody(tempFile);

            // 校验文件有效性
            if (tempFile.length() == 0) {
                FileUtil.del(tempFile); // 删除空文件
                return null;
            }
            return tempFile;
        } catch (Exception e) {
            log.error("下载 AI 图片失败：{}", e.getMessage(), e);
            FileUtil.del(tempFile); // 异常时清理临时文件
            return null;
        }
    }

    /**
     * 上传临时文件到 COS（完全参考 MermaidDiagramTool 的上传逻辑）
     */
    private String uploadToCos(File tempFile, String description) {
        // 构建 COS 存储路径（随机生成目录，避免文件名冲突）
        String keyName = String.format("/logo/%s/%s",
                RandomUtil.randomString(5),
                tempFile.getName());

        try {
            // 调用 COS 管理器上传文件
            return cosManager.uploadFile(keyName, tempFile);
        } finally {
            // 无论上传成功与否，都清理临时文件
            FileUtil.del(tempFile);
            log.info("Logo 临时文件已清理：{}", tempFile.getAbsolutePath());
        }
    }
}